.set noreorder

.include "gtereg.inc"
.include "inline_s.inc"

.section .text.SquareRoot12
.global SquareRoot12
.type SquareRoot12, @function
SquareRoot12:
	mtc2	$a0, C2_LZCS
	nop
	nop
	mfc2	$v0, C2_LZCR
	beq		$v0, 32, .Lbad_sqr12
	nop
	andi	$t0, $v0, 0x1
	addiu	$v1, $0 , -2
	and		$t2, $v0, $v1
	li		$t1, 19
	sub		$t1, $t2
	sra		$t1, 1
	addi	$t3, $t2, -24
	bltz	$t3, .Lvalue_less12
	nop
	sllv	$t4, $a0, $t3
	b		.Lvalue_greater12
.Lvalue_less12:
	addiu	$t3, $0 , 24
	sub		$t3, $t2
	srav	$t4, $a0, $t3
.Lvalue_greater12:
	addi	$t4, -64
	sll		$t4, 1
	la		$t5, _sqrt_table
	addu	$t5, $t4
	lh		$t5, 0($t5)
	nop

	bltz	$t1, .L1594c
	nop
	jr		$ra
	sllv	$v0, $t5, $t1

.L1594c:
	sub		$t1, $0 , $t1
	jr		$ra
	srl		$v0, $t5, $t1

.Lbad_sqr12:
	jr		$ra
	move	$v0, $0

.section .text.SquareRoot0
.global SquareRoot0
.type SquareRoot0, @function
SquareRoot0:
	mtc2	$a0, C2_LZCS
	nop
	nop
	mfc2	$v0, C2_LZCR
	beq		$v0, 32, .Lbad_sqr
	nop
	andi	$t0, $v0, 0x1
	addiu	$v1, $0 , -2
	and		$t2, $v0, $v1
	li		$t1, 31
	sub		$t1, $t2
	sra		$t1, 1
	addi	$t3, $t2, -24
	bltz	$t3, .Lvalue_less
	nop
	sllv	$t4, $a0, $t3
	b		.Lvalue_greater
.Lvalue_less:
	addiu	$t3, $0 , 24
	sub		$t3, $t2
	srav	$t4, $a0, $t3
.Lvalue_greater:
	addi	$t4, -64
	sll		$t4, 1
	la		$t5, _sqrt_table
	addu	$t5, $t4
	lh		$t5, 0($t5)
	nop
	sllv	$t5, $t5, $t1
	jr		$ra
	srl		$v0, $t5, 12
.Lbad_sqr:
	jr		$ra
	move	$v0, $0

.section .data._sqrt_table
.type _sqrt_table, @object
_sqrt_table:
	.hword 0x1000, 0x101f, 0x103f, 0x105e, 0x107e, 0x109c, 0x10bb, 0x10da
	.hword 0x10f8, 0x1116, 0x1134, 0x1152, 0x116f, 0x118c, 0x11a9, 0x11c6
	.hword 0x11e3, 0x1200, 0x121c, 0x1238, 0x1254, 0x1270, 0x128c, 0x12a7
	.hword 0x12c2, 0x12de, 0x12f9, 0x1314, 0x132e, 0x1349, 0x1364, 0x137e
	.hword 0x1398, 0x13b2, 0x13cc, 0x13e6, 0x1400, 0x1419, 0x1432, 0x144c
	.hword 0x1465, 0x147e, 0x1497, 0x14b0, 0x14c8, 0x14e1, 0x14f9, 0x1512
	.hword 0x152a, 0x1542, 0x155a, 0x1572, 0x158a, 0x15a2, 0x15b9, 0x15d1
	.hword 0x15e8, 0x1600, 0x1617, 0x162e, 0x1645, 0x165c, 0x1673, 0x1689
	.hword 0x16a0, 0x16b7, 0x16cd, 0x16e4, 0x16fa, 0x1710, 0x1726, 0x173c
	.hword 0x1752, 0x1768, 0x177e, 0x1794, 0x17aa, 0x17bf, 0x17d5, 0x17ea
	.hword 0x1800, 0x1815, 0x182a, 0x183f, 0x1854, 0x1869, 0x187e, 0x1893
	.hword 0x18a8, 0x18bd, 0x18d1, 0x18e6, 0x18fa, 0x190f, 0x1923, 0x1938
	.hword 0x194c, 0x1960, 0x1974, 0x1988, 0x199c, 0x19b0, 0x19c4, 0x19d8
	.hword 0x19ec, 0x1a00, 0x1a13, 0x1a27, 0x1a3a, 0x1a4e, 0x1a61, 0x1a75
	.hword 0x1a88, 0x1a9b, 0x1aae, 0x1ac2, 0x1ad5, 0x1ae8, 0x1afb, 0x1b0e
	.hword 0x1b21, 0x1b33, 0x1b46, 0x1b59, 0x1b6c, 0x1b7e, 0x1b91, 0x1ba3
	.hword 0x1bb6, 0x1bc8, 0x1bdb, 0x1bed, 0x1c00, 0x1c12, 0x1c24, 0x1c36
	.hword 0x1c48, 0x1c5a, 0x1c6c, 0x1c7e, 0x1c90, 0x1ca2, 0x1cb4, 0x1cc6
	.hword 0x1cd8, 0x1ce9, 0x1cfb, 0x1d0d, 0x1d1e, 0x1d30, 0x1d41, 0x1d53
	.hword 0x1d64, 0x1d76, 0x1d87, 0x1d98, 0x1daa, 0x1dbb, 0x1dcc, 0x1ddd
	.hword 0x1dee, 0x1e00, 0x1e11, 0x1e22, 0x1e33, 0x1e43, 0x1e54, 0x1e65
	.hword 0x1e76, 0x1e87, 0x1e98, 0x1ea8, 0x1eb9, 0x1eca, 0x1eda, 0x1eeb
	.hword 0x1efb, 0x1f0c, 0x1f1c, 0x1f2d, 0x1f3d, 0x1f4e, 0x1f5e, 0x1f6e
	.hword 0x1f7e, 0x1f8f, 0x1f9f, 0x1faf, 0x1fbf, 0x1fcf, 0x1fdf, 0x1fef
